import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Vector;





public class TestBocadilloImpl {
	Bocadillo boc;
	C_pedido pedido;
	Vector<Integer> ingredientes;
	
	@Before
	public void setUp () {
		ingredientes=new Vector<Integer>();
		ingredientes.add(1);
		ingredientes.add(1);
		ingredientes.add(3);
		ingredientes.add(4);
		ingredientes.add(5);
		pedido=new C_pedidoImpl(5,ingredientes);
		boc=new BocadilloImpl(pedido);
		
	}
	@After
	public void tearDown(){
		boc=null;
	}
	
	@Test(expected = CartaIncorrectaException.class) //Intenta añadir un producto que no esta
	public void testadd_producto() throws CartaIncorrectaException{
		C_producto prod=new C_productoImpl(7,0);
		boc.add_producto(prod, 1);
	}
	
	@Test(expected = CartaIncorrectaException.class)	//Intenta añadir un producto antes
	public void testadd_producto2() throws CartaIncorrectaException{					//del primer pan negro
		C_producto prod=new C_productoImpl(4,0);
		boc.add_producto(prod, 1);
	}
	
	@Test
	public void testadd_productoYesta() throws CartaIncorrectaException{
		C_producto prod=new C_productoImpl(1,0);
		assert boc.esta(1,1)==0;
		boc.add_producto(prod, 1);
		assert boc.esta(1,1)==1;
	}
	
	@Test
	public void testesta(){
		assert boc.esta(1)==2;
		assert boc.esta(3)==1;
		assert boc.esta(4)==1;
		assert boc.esta(5)==1;
	}
	
	@Test
	public void testget_pedido(){
		assertEquals (pedido,boc.get_pedido());
	}
	
	@Test
	public void testasignar_pedidoYget_pedido(){
		C_pedido ped=new C_pedidoImpl(3,new Vector<Integer>());
		boc.asignar_pedido(ped);
		assertEquals (ped,boc.get_pedido());
	}
	
	@Test
	public void testadd_productoYget_puestos() throws CartaIncorrectaException{
		C_producto pan,prod1,prod2;
		Vector<C_producto> prods=new Vector<C_producto>();
		pan=new C_productoImpl(1,4);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		boc.add_producto(pan, 1);
		boc.add_producto(prod1, 1);
		boc.add_producto(prod2, 1);
		prods.add(pan);
		prods.add(prod1);
		prods.add(prod2);
		assertEquals (prods,boc.get_puestos(1));
	}
	
	@Test
	public void testnecesita_orejas(){
		assert (!boc.necesita_orejas());
	}
	
	@Test
	public void testcolocar_orejasYnecesita_orejas(){
		C_producto orejas=new C_productoImpl(4,0);
		boc.colocar_orejas(orejas);
		assert (boc.necesita_orejas());
	}
	
	@Test
	public void testtiene_comodin(){
		assert (!boc.tiene_comodin(1));
	}
	
	@Test
	public void testadd_productoYtiene_comodin() throws CartaIncorrectaException{
		C_producto comodin=new C_productoImpl(2,1);
		boc.add_producto(comodin,1);
		assert boc.tiene_comodin(1);
	}
	
	@Test
	public void testadd_productoYdescartar() throws CartaIncorrectaException{
		C_producto pan1,pan2,prod1,prod2;
		Vector<C_producto> descartadas,prods=new Vector<C_producto>();
		pan1=new C_productoImpl(1,4);
		pan2=new C_productoImpl(1,5);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		boc.add_producto(pan1, 1);
		boc.add_producto(prod1, 1);
		boc.add_producto(pan2, 2);
		boc.add_producto(prod2, 2);
		prods.add(pan1);
		prods.add(prod1);
		prods.add(prod2);
		prods.add(pan2);
		descartadas=boc.descartar();
		assert (descartadas.containsAll(prods) && descartadas.size()==prods.size());
	}
	
	@Test
	public void testentregar1() throws CartaIncorrectaException{
		C_producto pan,prod1,prod2;
		pan=new C_productoImpl(1,4);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		boc.add_producto(pan, 1);
		boc.add_producto(prod1, 1);
		boc.add_producto(prod2, 1);
		assert (boc.entregar(1)==-1);
	}
	
	@Test
	public void testentregar2() throws CartaIncorrectaException{
		C_producto pan1,prod1,prod2,prod3,pan2;
		pan1=new C_productoImpl(1,4);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		pan2=new C_productoImpl(1,3);
		prod3=new C_productoImpl(3,3);
		boc.add_producto(pan1, 2);
		boc.add_producto(prod1, 2);
		boc.add_producto(prod2, 2);
		boc.add_producto(prod3, 2);
		boc.add_producto(pan2, 2);
		assert (boc.entregar(2)==0);
	}
	
	@Test
	public void testentregar3() throws CartaIncorrectaException{
		C_producto pan1,prod1,prod2,prod3,pan2,orejas;
		pan1=new C_productoImpl(1,4);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		pan2=new C_productoImpl(1,3);
		prod3=new C_productoImpl(3,3);
		orejas=new C_productoImpl(5,0);
		boc.add_producto(pan1, 2);
		boc.add_producto(prod1, 2);
		boc.add_producto(prod2, 2);
		boc.add_producto(prod3, 2);
		boc.add_producto(pan2, 2);
		boc.colocar_orejas(orejas);
		assert (boc.entregar(2)==-1);
	}

	
	@Test
	public void testentregar4() throws CartaIncorrectaException{
		C_producto pan1,prod1,prod2,pan2,comodin;
		pan1=new C_productoImpl(1,4);
		prod1=new C_productoImpl(4,3);
		prod2=new C_productoImpl(5,2);
		pan2=new C_productoImpl(1,3);
		comodin=new C_productoImpl(2,3);
		boc.add_producto(pan1, 2);
		boc.add_producto(prod1, 2);
		boc.add_producto(prod2, 2);
		boc.add_producto(comodin, 2);
		boc.add_producto(pan2, 2);
		assert (boc.entregar(2,3)==0);
	}
	
}

